﻿using System;
using System.Collections;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;

using System.Reflection;
using System.Reflection.Emit;
using Tong.DataOperation;
//引入C# 代码生成器和代码编译器的实例的访问。
using Microsoft.CSharp;

public partial class 序列反射動態程式集_動態程式集 : System.Web.UI.Page
{
    Tong.TongUse TextData = new Tong.TongUse();
    动态编译 MyAssembl = new 动态编译();
    protected void Page_Load(object sender, EventArgs e)
    {
        Data_CX_Column_QueryTable<Data_CX_Column> operColoumn = new Data_CX_Column_QueryTable<Data_CX_Column>();


        MySqlCmd(operColoumn.Oper_SelectToObject(5)[0]);
        

    
    }


    protected void Button1_Click(object sender, EventArgs e)
    {
        string[] Codetext = new string[] { TextBox1.Text };
        object psou = (object)typeof(DataTable);
        System.CodeDom.Compiler.CompilerResults pp = MyAssembl.Statr(Codetext);
        //開始實現 資料動態幫定方法的使用

        //得到這個方法的資訊
        //System.Reflection.MethodInfo MyMethodinfo = typeof(pp).GetMethod("uu");
        //(string) MyMethodinfo.Invoke(Activator.CreateInstance(typeof(pp)),new object[]{TextBox1.Text})
        //以上代碼成功實現pp類型中的uu方法;
        //System.Reflection.MethodInfo MyMethodInfo = pp.CompiledAssembly.GetModules().First().GetMethods().First();

        Type MyTempType = pp.CompiledAssembly.GetModules().First().GetTypes().First();

        DataTable Mydt = new DataTable();
        Mydt.TableName = "sdfsdfdsfs";
        Mydt = TextData.SqlataSet("select top 50 * from [cx_News]").Tables[0];
        Response.Write(

            pp.CompiledAssembly.GetModules().First().GetTypes().First().GetMethods().First().Invoke(
             Activator.CreateInstance(MyTempType),new object[]{Guid.NewGuid().ToString()}
                                      )

            );
        Response.End();

        foreach (var s in pp.CompiledAssembly.GetLoadedModules())
        {
            Response.Write(s.Name+"<br/>");
        }

        foreach (string str in pp.Output)
        {
            Response.Write(str + "<br/>");
        }
        

    }

    /// <summary>
    ///传入一个类型，反回这个类型的 Cmd对象
    /// </summary>
    /// <param name="TableType"></param>
    /// <returns></returns>
    protected System.Data.SqlClient.SqlCommand MySqlCmd(object TableType)
    { 
        //得到所有属性
        foreach(PropertyInfo Property in TableType.GetType().GetProperties())
        {

            Response.Write(string.Format("名:{0}　　返回类型{1} 值:{2} <br/>", Property.Name, Property.PropertyType.Name, Property.GetValue(TableType, null)));

            
         
        }

        return new System.Data.SqlClient.SqlCommand();
    }
}


[Serializable]
class pp {


    public  string xxxx = "sdfsdfsdfsd";

    public string uu(string uu)

    {
        return uu;
    }
    }


/// <summary>
/// 使用
/// using System.Reflection.Emit;
/// /AssemblyBuilder 类 
/// 创建
/// </summary>
class 动态程序集
{ 
//    .NET Framework 类库  
//AssemblyBuilder 类  
//定义并表示动态程序集。

    ///// <summary>
    ///// 动枋程序集的名字
    ///// </summary>
    //AssemblyName AName = new AssemblyName("fgdfgfd  ");
    ///// <summary>
    /////  订定一个新的动态程序集
    ///// </summary>
    //AssemblyBuilder ABuilder = AppDomain.CurrentDomain.DefineDynamicAssembly(AName, AssemblyBuilderAccess.RunAndSave);
    ///// <summary>
    ///// 定义动态程序集中的模块
    ///// </summary>
    //ModuleBuilder ModeuleBuild = ABuilder.DefineDynamicModule(AName.Name, AName.Name + ".dll");
    ///// <summary>
    ///// 动态创建一个类型的新实例
    ///// </summary>
    //TypeBuilder TypeBulid = ModeuleBuild.DefineType("MyTest", TypeAttributes.Public);

    
}

/// <summary>
/// 使用 CSharp编辑器
/// </summary>
class 动态编译
{
    /// <summary>
    /// 提供对 C# 代码生成器和代码编译器的实例的访问。
    /// </summary>
    Microsoft.CSharp.CSharpCodeProvider MyCSharp = new CSharpCodeProvider();
    /// <summary>
    /// 用于实现编辑器操作的参数
    /// </summary>
    System.CodeDom.Compiler.CompilerParameters MyCp;
    System.CodeDom.Compiler.CompilerResults Cr;

  public  System.CodeDom.Compiler.CompilerResults Statr(string[] ppp)
    { 
        MyCp = new System.CodeDom.Compiler.CompilerParameters(){
         GenerateExecutable = false,//是不是生成exe文件
         /// OutputAssembly ="MyTest.dll",//程序集名称
          IncludeDebugInformation= true//是不是可以在已经编辑的文件中包含信息
        };
        ///添加引用程序集
        MyCp.ReferencedAssemblies.Add("System.dll");
        MyCp.ReferencedAssemblies.Add("System.Xml.dll");
        MyCp.ReferencedAssemblies.Add("System.Data.dll");
        MyCp.ReferencedAssemblies.Add("System.Web.dll");

        MyCp.GenerateInMemory= true;//在内存中生成输出
        MyCp.CompilerOptions = "/target:library ";//编辑器的使命字符    
        
        Cr = MyCSharp.CompileAssemblyFromSource(MyCp, ppp);
        
       
        return Cr;
    }
}


